package com.langfeiyes.pattern.principle;

import java.io.Serializable;

/**
 * 懒汉式
 */
public class Singleton implements Serializable, Cloneable {
    //唯一的实例，此时实例为null，当第一次反问时再构建
    private static volatile Singleton instance;

    //私有的构造器，避免外部构建实例
    private Singleton() {
        //当已经创建唯一实例了，不允许在继续创建
        //此处可以破解 反射构建多例的问题
        if (instance !=null) {
            throw new RuntimeException("实例已经被创建，可以调用getInstance方法获得");
        }else{
            instance = this;
        }
    }

    //提供唯一对外部访问方法
    public static Singleton getInstance() {
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    //反系列化时，会调用这个方法，只需要重写该方法即可
    //此处可以破解 反系列化多例的问题
	private Object readResolve() {
        return getInstance();
    }

    //普通实例方法
    public void show(){
        System.out.println(this);
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return this;
    }
}
